package com.xb.loan.cashier.biz.service;


import com.xb.loan.cashier.biz.dao.bean.CashierEncashOrder;
import com.xb.loan.cashier.biz.dao.bean.CashierPayChannelType;
import com.xb.loan.log.exception.BizException;

import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;

/**
 * 北业务类,提现订单相关
 */
public interface CashierEncashOrderService {
    
    CashierEncashOrder selectByOrderId(String orderId);

    /**
     * 更新提现订单状态为处理中
     * @param cashierOrderId
     * @param paychannelType
     * @param batchId
     */
    int initEncashOrder(String cashierOrderId, int paychannelType, String batchId);

    /**
     * 更新一个批次的第一个提现订单状态为处理中，并添加提现任务
     * @param orderId
     * @param payChannelId
     * @param paychannelType
     * @param bankCode
     * @param batchId
     */
    int initFirstEncashOrder(String orderId, String payChannelId, int paychannelType, String bankCode, String batchId);

    /**
     * 根据提现银行找到所有的提现渠道类型
     * @param sellBank
     * @return
     */
    List<CashierPayChannelType> selectChannel(String sellBank);

    /**
     * 根据提现状态和平台银行编码查询提现订单
     * @param status
     * @param bankCodePlat
     * @param pageSize
     * @return
     */
    List<CashierEncashOrder> selectEncashOrders(int status, String bankCodePlat, Date endTime, int pageNo, int pageSize);

    /**
     * 获取该批次的提现订单数量
     * @param batchId
     * @return
     */
    int selectBatchCount(String batchId);

    /**
     * 按批次号查询提现订单
     * @param batchId
     * @return
     */
    List<CashierEncashOrder> selectBatchOrders(String batchId, int pageNo, int pageSize);

    /**
     * 处理提现结果
     * @param path
     * @throws FileNotFoundException
     * @throws UnsupportedEncodingException
     */
    void updateEncashResultFile(String path, String fileName) throws UnsupportedEncodingException, FileNotFoundException;

    /**
     * 提现退票
     * @param orderId
     */
    int refundEncashResult(String orderId, String day);

    /**
     * 查询需要回推的提现订单
     * @param sendTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<CashierEncashOrder> selectPushOrders(Date sendTime, int maxPushCount, int pageNo, int pageSize);
    
    /**
     * 回推提现结果
     * @param orderId
     * @return
     */
    void pushEncashOrder(String orderId) throws BizException;
    
    void pushEncashOrder(CashierEncashOrder order) throws BizException;

    void insert(CashierEncashOrder order);

    /**
     * 更新提现结果
     * //TODO 添加方法功能描述
     * @param cashierOrderId
     * @param status
     * @param tradeDay
     * @return
     */
    int updateEncashResult(String cashierOrderId, int status, Date tradeDay, String msg);

    /**
     * 对账时修改提现状态，对账专用
     * @param orderId
     * @param status
     * @param tradeDay
     * @return
     */
    int updateEncashResult1(String orderId, int status, Date tradeDay);

    /**
     * 更新对账状态
     * @param orderId
     * @param accountStatus
     * @param accountDay
     */
    int updateAccountStatus(String accountId, String orderId, int accountStatus, String accountDay);

    /**
     * 查询第三方少的数据
     * @param day
     * @param accountId
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<CashierEncashOrder> selectThirdLessData(String day, String accountId, int pageNo, int pageSize);

    /**
     * 账期内未返回的成功数据（包含跨期的数据、收银台成功第三方失败的数据）
     * @param day
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<CashierEncashOrder> selectAccountNonDatas(String day, String accountId, int pageNo, int pageSize);

    /**
     * 根据订单id查询
     * @param orderIds
     * @return
     */
    List<CashierEncashOrder> selectByOrderIds(List<String> orderIds);

    /**
     * 更新第三方账期时间
     * @param orderIds
     * @param accountDay
     */
    void updateThirdAccountTime(List<String> orderIds, String accountDay);
    /**
     *查询当前账期内是否发生过退票 (不包含当前账期)
     * @param accountPeriod
     * @return
     */
    public int queryRefundCount(String accountPeriod);
    /**
     *查询当前账期内发生退票的所有账期(不包含当前账期)
     * @param accountPeriod
     * @return
     */
    public List<String> queryRefundAccountPeriod(String accountPeriod);
    /**
     *查询当前账期内是否有未与第三方对账的记录
     * @param accountPeriod
     * @return
     */
    public int queryCountByAccountPeriod(String accountPeriod);
    /**
     *根据当前账期分页查询成功、失败订单且已与第三方对过账的数据
     * @param accountPeriod
     * @param start
     * @param limit
     * @return
     */
    public List<CashierEncashOrder> queryAccountByPage(String accountPeriod, int start, int limit);
    /**
     * 根据当前账期分页查询成功、失败订单且已与第三方对过账的数据条数
     * @param accountPeriod
     * @return
     */
    public int queryAccountCount(String accountPeriod);

    /**
     * 生成提现密钥(使用收银台密钥)
     * @param orderId
     * @param platId
     * @param userId
     * @param partnerId
     * @param moneyStr
     * @param returnCode
     * @return
     */
    String genEncashSign(String orderId, String platId, String userId, String partnerId, String moneyStr, String returnCode);

    /**
     * 验证平台提现密钥(使用平台公钥)
     * @param order
     * @return
     */
    boolean validateEncashSign(CashierEncashOrder order);

    /**
     *  更新批订单并推送给平台
     * @param batchId
     * @param fileName
     * @param status
     * @param tradeDay
     * @param msg
     */
    void updateBatchOrder(String batchId, String fileName, int status, Date tradeDay, String msg) throws Exception;
    
    /**
     * 根据批次号查询订单
     * @param batchId
     * @return
     */
    List<CashierEncashOrder> queryBatchOrder(String batchId);

}
